parser grammar YACCParser;

options {
  language = Java;
  tokenVocab = YACCLexer;
  k = 10;
}

@members {
      //Lista que guarda los errores que se van produciendo durante el analisis lexico
    List<RecognitionException> errors = new ArrayList<RecognitionException>();

    //Metodo que devuelve la lista de errores que se han producido
    public List<RecognitionException> getAllErrors() {
        return errors;
    }
    
    //Metodo que comprueba si se han producido errores
    public boolean hasErrors() {
        return !errors.isEmpty();
    }

    //Metodo del analizador lexico sobrescrito para que los errores que se van
    //produciendo durante el analisis lexico en vez de mostrarse por consola
    //se guarden en la lista de errores (errors)
    @Override
    public void reportError(RecognitionException e) {
        errors.add(e);
    }
}
@header {
  package PracticasPL.practica7;
  import java.util.ArrayList;
}


//yacc: bloq3 EOF;
//bloq3: codigo_c;
//codigo_c : define;
define : DEFINE EOF; // IDENT (DOUBLE | NUMERO);

//| sentencia_if| llamada_funcion SEMICOLON| operaciones | def_fichero | declaracion_funcion | IDENT SEMICOLON;


//yacc: bloq1 SEPARADOR_BLOQUES bloq2 (SEPARADOR_BLOQUES bloq3)? EOF;
//
//bloq1: definiciones_c def_patrones;
//
//definiciones_c: SEPARADOR_CABECERAS definiciones SEPARADOR_CABECERAS;
//
//definiciones: (include | define | def_tipo | def_variables)+;
//
//
//
//def_patrones : (inicio | union | def_token | precedencia_operadores)+;
//
//inicio : IDENT_PATRON IDENT;
//
//union : IDENT_PATRON LLAVES def_variables+ LLAVES; 
//
//precedencia_operadores: IDENT_PATRON operador_comillas operador_comillas;
//
//def_token : IDENT_PATRON exptoken IDENT+;
//
//exptoken : COMPARADORES IDENT COMPARADORES;
//
//
//
//
//bloq2: reglas+;
//
//reglas : IDENT COLON (OR parte_derecha)+ SEMICOLON;
//
//parte_derecha :  exp_gramaticales;
//
//exp_gramaticales : operador_comillas? PAREN_AB_COMILLAS? nombre   MODULO? contenido? PAREN_CER_COMILLAS? bloq_c?;
//
//nombre : IDENT | NUMBER;
//
//contenido : (operador_comillas |CARACTER | IDENT |CARACTER_ESPECIAL | IDENT_PATRON)+; 
//
//bloq_c : LLAVES codigo_c+ LLAVES;
//
//
//bloq3: codigo_c+;
//
//codigo_c : define| sentencia_if| llamada_funcion SEMICOLON| operaciones | def_fichero | declaracion_funcion | IDENT SEMICOLON;
//
//include: INCLUDE COMPARADORES NOM_FICH COMPARADORES;
//
//define : DEFINE IDENT (DOUBLE | NUMERO);
//
//def_tipo : TYPEDEF estructura;
//
//estructura : STRUCT IDENT LLAVES def_variables LLAVES IDENT SEMICOLON;
//
//operaciones : (VAR_ACTUAL | VECTOR) (OPASIG (expresion | VECTOR | llamada_funcion))+ SEMICOLON;
//
//operador_comillas : OP_SUMA_COMILLAS | OP_RESTA_COMILLAS | OP_MUL_COMILLAS | OP_DIV_COMILLAS | OP_ASIG_COMILLAS | COMA_COMILLAS;
//
//def_fichero : EXTERN FILE def_puntero SEMICOLON;
//
//declaracion_funcion : (tipo | IDENT)? IDENT PARENTESIS parametros? PARENTESIS LLAVES cuerpo+ LLAVES; 
//
//
//cuerpo : def_variables | asignacion | sentencia_if |bucle_while | llamada_funcion SEMICOLON ;
//
//bucle_while : WHILE PARENTESIS condicion PARENTESIS cuerpo_sentencia;
//
//bucle_for : FOR PARENTESIS elementos_bucle PARENTESIS cuerpo_sentencia;
//
//elementos_bucle : inicializacion? SEMICOLON parada? SEMICOLON incremento?;
//
//inicializacion : asignacion;
//
//parada : PARENTESIS IDENT OPERADORES IDENT PARENTESIS COMPARADORES IDENT;
//
//
//
//sentencia_if : IF PARENTESIS  parametros_if PARENTESIS  cuerpo_sentencia;
//
//parametros_if : (condicion | llamada_funcion | postincremento) (OR_C (condicion | IDENT))?;
//
//exp : PARENTESIS asignacion PARENTESIS;
//
//condicion : ( IDENT | VAR_NUMERO | VAR_ACTUAL | exp) COMPARADORES ( NUMERO | VAR_NUMERO | VAR_ACTUAL | COMILLAS_SIMPLES COMILLAS_SIMPLES);
//
//incremento : (COMA? (preincremento | asignacion))+;
//
//postincremento :  ( IDENT) OPERADORES+;
//
//preincremento : OPERADORES+ (IDENT);
//
//
//cuerpo_sentencia : LLAVES (bucle_for | asignacion | llamada_funcion SEMICOLON | IDENT SEMICOLON | sentencia_if | def_variables | CONTINUE SEMICOLON)+ LLAVES;
//
//llamada_funcion : IDENT PARENTESIS parametros? PARENTESIS;
//
//parametros : VOID | (COMA? (tipo)? (IDENT | VECTOR | CADENA | def_puntero | VAR_NUMERO) )+;
//
//expresion : OPERADORES? (VAR_NUMERO | VAR_ACTUAL) (OPERADORES (VAR_NUMERO | VAR_ACTUAL ))?;
//
//def_variables : (tipo | IDENT ) (COMA? (IDENT OPASIG NUMERO| VECTOR | def_puntero OPASIG IDENT) (PARENTESIS PARENTESIS)?)+  SEMICOLON ;
//
//asignacion : (IDENT | VECTOR | def_puntero) (IDENT COMA IDENT)? OPASIG (IDENT SEMICOLON | llamada_funcion SEMICOLON?| NUMERO SEMICOLON? | VAR_NUMERO SEMICOLON? | VECTOR SEMICOLON? | operacion);
////asign_var : OPASIG (IDENT | NUMERO);
//
//def_puntero : OPERADORES+ (IDENT );
//
//tipo : INT | CHAR | STRING | DOUBLE | REGISTER;
//
//operacion : IDENT OPERADORES CARACTER SEMICOLON;